1
บทนำสู่ PyTorch: ทำไมเทนเซอร์จึงสำคัญ
EvoClass-AI002บทเรียนที่ 1
00:00

บทนำสู่ PyTorch: ทำไมเทนเซอร์จึงสำคัญ

PyTorch เป็นเฟรมเวิร์กโอเพนซอร์สที่ยืดหยุ่นและมีความไดนามิกสูง ซึ่งได้รับความนิยมในการวิจัยด้านการเรียนรู้เชิงลึกและการพัฒนาแบบรวดเร็ว ที่แก่นกลางของมันคือ เทนเซอร์เป็นโครงสร้างข้อมูลที่จำเป็นอย่างยิ่ง มันคืออาร์เรย์หลายมิติที่ออกแบบมาเพื่อจัดการกับการทำงานทางตัวเลขที่จำเป็นสำหรับโมเดลการเรียนรู้เชิงลึกได้อย่างมีประสิทธิภาพ โดยรองรับการเร่งความเร็วด้วย การเร่งความเร็วด้วย GPU automatically.

1. ทำความเข้าใจโครงสร้างของเทนเซอร์

ทุกข้อมูลนำเข้า ผลลัพธ์ และพารามิเตอร์ของโมเดลใน PyTorch ถูกห่อหุ้มไว้ในเทนเซอร์ พวกเขาทำหน้าที่เหมือนอาร์เรย์ของ NumPy แต่ได้รับการปรับให้เหมาะสมกับการประมวลผลบนฮาร์ดแวร์เฉพาะ เช่น GPUทำให้มีประสิทธิภาพมากกว่าในการดำเนินการทางพีชคณิตเชิงเส้นขนาดใหญ่ที่จำเป็นสำหรับเครือข่ายประสาทเทียม

คุณสมบัติหลักที่กำหนดเทนเซอร์มีดังนี้:

  • รูปร่าง: กำหนดมิติของข้อมูล แสดงเป็นลำดับ (เช่น $4 \times 32 \times 32$ สำหรับชุดภาพ)
  • ชนิดข้อมูล: ระบุประเภทตัวเลขขององค์ประกอบที่เก็บ (เช่น torch.float32สำหรับน้ำหนักของโมเดล, torch.int64สำหรับการดัชนี)
  • อุปกรณ์: บ่งบอกตำแหน่งฮาร์ดแวร์จริง: โดยทั่วไปแล้วคือ 'cpu'หรือ 'cuda' (GPU NVIDIA)
กราฟไดนามิกและระบบอัตโนมัติคำนวณอนุพันธ์ (Autograd)
PyTorch ใช้โมเดลการประมวลผลตามลำดับ หมายความว่ากราฟการคำนวณจะถูกสร้างขึ้นเมื่อปฏิบัติการถูกดำเนินการ ซึ่งทำให้เครื่องมือคำนวณอนุพันธ์อัตโนมัติที่ฝังอยู่ในตัว อย่าง Autogradสามารถติดตามทุกการดำเนินการบนเทนเซอร์ ภายใต้เงื่อนไขที่ตั้งค่าคุณสมบัติ requires_grad=True ไว้ ทำให้สามารถคำนวณเกรเดียนต์ได้อย่างง่ายดายระหว่างการคำนวณย้อนกลับ (backpropagation)
fundamentals.py
เทอร์มินัลbash — pytorch-env
> เตรียมพร้อมแล้ว คลิก "รัน" เพื่อดำเนินการ
>
ตัวตรวจสอบเทนเซอร์สด

รันโค้ดเพื่อดูเทนเซอร์ที่ใช้งานอยู่
คำถามที่ 1
คำสั่งใดสร้างเทนเซอร์ขนาด $5 \times 5$ ที่มีจำนวนสุ่มตามการแจกแจงแบบสม่ำเสมอระหว่าง 0 ถึง 1?
torch.rand(5, 5)
torch.random(5, 5)
torch.uniform(5, 5)
torch.randn(5, 5)
คำถามที่ 2
หากเทนเซอร์ $A$ อยู่บนหน่วยประมวลผล (CPU) และเทนเซอร์ $B$ อยู่บนอุปกรณ์ CUDA จะเกิดอะไรขึ้นหากคุณพยายามคำนวณ $A + B$?
เกิดข้อผิดพลาด เพราะการดำเนินการต้องใช้เทนเซอร์ที่อยู่บนอุปกรณ์เดียวกัน
PyTorch ย้าย $A$ ไปยังอุปกรณ์ CUDA อัตโนมัติและดำเนินการต่อไป
การดำเนินการถูกทำบน CPU และผลลัพธ์ถูกส่งกลับไปยัง CPU
คำถามที่ 3
ชนิดข้อมูล (dtype) ที่พบบ่อยที่สุดที่ใช้กับน้ำหนักของโมเดลและผลลัพธ์ระหว่างการคำนวณในงานเรียนรู้เชิงลึกคืออะไร?
torch.float32 (จำนวนทศนิยมความแม่นยำเดี่ยว)
torch.int64 (จำนวนเต็มยาว)
torch.bool
torch.float64 (จำนวนทศนิยมความแม่นยำสองเท่า)
ภารกิจท้าทาย: การจัดการเทนเซอร์และรูปร่าง
เตรียมเทนเซอร์เพื่อการดำเนินการเมทริกซ์เฉพาะ
คุณมีเวกเตอร์ลักษณะ (feature vector) $F$ ที่มีรูปร่าง $(10,)$. คุณต้องคูณมันกับเมทริกซ์น้ำหนัก $W$ ที่มีรูปร่าง $(10, 5)$ เพื่อให้การคูณเมทริกซ์ (MatMul) ทำงานได้ $F$ ต้องมีมิติ 2 ด้าน
ขั้นตอนที่ 1
รูปร่างของ $F$ ควรเป็นอย่างไรก่อนทำการคูณกับ $W$?
คำตอบ:
มิติภายในต้องตรงกัน ดังนั้น $F$ ต้องเป็น $(1, 10)$ แล้ว $(1, 10) @ (10, 5) \rightarrow (1, 5)$
รหัส: F_new = F.unsqueeze(0)หรือ F_new = F.view(1, -1)
ขั้นตอนที่ 2
ดำเนินการคูณเมทริกซ์ระหว่าง $F_{new}$ กับ $W$ (รูปร่าง $(10, 5)$)
คำตอบ:
การดำเนินการเป็นการคูณเมทริกซ์ทั่วไป
รหัส: output = F_new @ Wหรือ output = torch.matmul(F_new, W)
ขั้นตอนที่ 3
วิธีใดที่ส่งคืนเทนเซอร์ที่มีมิติที่กำหนดไว้โดยเฉพาะ ทำให้คุณสามารถแปลงเทนเซอร์กลับเป็นรูปร่าง $(50,)$ ได้? (สมมุติว่า $F$ เริ่มต้นที่ $(5, 10)$ และตอนนี้ถูกแปลงเป็นรูปร่างแบนแล้ว)
คำตอบ:
ใช้ viewหรือ reshapeวิธีการ วิธีที่เร็วที่สุดในการแปลงเป็นแบนคือการใช้ -1สำหรับมิติหนึ่ง
รหัส: F_flat = F.view(-1)หรือ F_flat = F.reshape(50)